#!/bin/bash



# 读取用户输入的虚拟网名称，并存储在变量community中
read -p "请输入虚拟网名称:" community

# 读取用户输入的本机IP地址，并存储在变量name中
read -p "请输入本机要使用的ip地址:" name

# 读取用户输入的服务器地址及端口，并存储在变量host中
read -p "请输入服务器地址及端口:" host

# 选择N2N版本
echo "可选版本: 3.0-stable，2.8-stable，2.6-stable，2.4-stable"
read -p "请选择N2N版本:" n2n_version

# 创建n2n启动脚本
echo "sudo /usr/local/sbin/edge -a $name -c $community -l $host" > /usr/sbin/n2n

# 创建停止n2n的脚本
echo "sudo killall -9 edge" > /usr/sbin/noff

# 使脚本文件可执行
chmod +x /usr/sbin/n2n
chmod +x /usr/sbin/noff

echo "拷贝n2n成功!"

# 下载并解压N2N源代码
if [ ! -d "n2n" ]; then
    git clone https://github.com/ntop/n2n.git
fi

# 进入n2n源代码目录
cd n2n || { echo "n2n源代码目录不存在，请检查文件结构。"; exit 1; }

# 切换到选择的N2N版本分支
case $n2n_version in
    "3.0-stable")
        git checkout 3.0-stable
        ;;
    "2.8-stable")
        git checkout 2.8-stable
        ;;
    "2.6-stable")
        git checkout 2.6-stable
        ;;
    "2.4-stable")
        git checkout 2.4-stable
        ;;
    *)
        echo "无效的N2N版本选择，请选择3.0-stable，2.8-stable，2.6-stable，2.4-stable。"
        exit 1
        ;;
esac

# 安装必要的依赖
if command -v apt-get >/dev/null; then
    sudo apt-get update
    sudo apt-get install -y libssl-dev cmake net-tools gcc g++
elif command -v yum >/dev/null; then
    sudo yum install -y openssl-devel cmake net-tools gcc gcc-c++
else
    echo "未检测到apt-get或yum，请确保您的系统已安装这些包管理器。"
    exit 1
fi

# 编译安装n2n
mkdir -p build
cd build || { echo "无法进入build目录，请检查文件结构。"; exit 1; }
cmake ..
make && sudo make install

# 检查edge二进制文件是否存在
if [ ! -f /usr/local/sbin/edge ]; then
    echo "edge 二进制文件未找到，请检查编译安装是否成功。"
    exit 1
fi

# 创建n2n配置文件
sudo mkdir -p /etc/n2n
sudo tee /etc/n2n/edge.conf > /dev/null <<EOF
# n2n edge configuration file
-a $name
-c $community
-l $host
EOF
echo "n2n配置文件已创建。"

# 运行n2n
/usr/sbin/n2n > /var/log/n2n.log 2>&1 &

echo "n2n安装成功,正在检查连接状态,请等待"

# 等待5秒
sleep 5

# 使用用户输入的服务器地址进行ping测试
if ! ping -Q 2 -c 2 -t 64 $(echo $host | cut -d: -f1); then
    echo "`date '+%Y-%m-%d %T'` n2n 连接服务器失败 !"
else
    echo "`date '+%Y-%m-%d %T'` n2n 连接服务器成功 !"
fi

# 检查n2n接口是否UP
if ! ifconfig | grep -q "edge0"; then
    echo "n2n接口未启动，请检查n2n配置。"
    exit 1
fi

# 检查路由表
# 获取用户输入的IP地址的网络部分
network=$(echo $name | cut -d. -f1-3).0/24
if ! ip route | grep -q "$network dev edge0"; then
    sudo ip route add $network dev edge0
fi

# 检查防火墙设置
sudo ufw allow $(echo $host | cut -d: -f2)/udp

# 检查n2n的MTU设置
sudo ifconfig edge0 mtu 1400

# 重新启动n2n服务
sudo killall -9 edge
sudo /usr/sbin/n2n &

# 检查网络接口状态
ifconfig edge0

# 检查IP地址分配
if ! ifconfig edge0 | grep -q "$name"; then
    echo "n2n接口未分配正确的IP地址，请检查n2n配置。"
    exit 1
fi

# 检查ARP表
arp -a

# 检查n2n的社区支持
echo "如果以上方法都无效，可以在n2n的社区或者论坛寻求帮助，提供详细的配置和日志信息。"

# 检查网络拓扑
echo "确保网络拓扑中没有防火墙、路由器或其他设备阻止n2n的流量。"

echo "部署脚本执行完毕。"

# 检查系统日志（限制输出时间）
echo "正在检查系统日志，请等待..."
sudo tail -n 50 /var/log/syslog